package Util;

import javax.xml.soap.Node;

/**
 * @author attcat
 * ---做一个有趣的程序员
 * @date 2022-10-22 21:13
 * @description
 * 多链表的操作相信成一个火车
 */
public class SingleLinkedList {
    // 当前火车中车厢的个数(实际存储的元素个数)
    private int size;
    // 当前火车的第一个结点
    public ListNode head;

    public ListNode getHead() {
        return head;
    }

    public void setHead(ListNode head) {
        this.head = head;
    }

    public void addFirst(int data){
        if(size == 0) {
            ListNode node = new ListNode(data);
            head = node;
            size ++;
        }else {
            // 当前火车已经存在结点了
            ListNode node = new ListNode(data);
            node.next = head;
            head = node;
            size ++;
        }

    }



    private void addIndex(int index,int data) {
        // 一定注意边界条件
        // 判断index的合法性
        if (index < 0 || index > size) {
            System.err.println("add index illegal!");
            return;
        }
        // 若index = 0;
        if (index == 0) {
            // 链表的头部节点插入
            addFirst(data);
            return;
        }
        // 说明此时index合法且在中间位置(包含最后节点)
        // 此时需要找到待插入位置index的前驱节点
        // 单链表中只能从前到后遍历
        ListNode node = new ListNode(data);
        ListNode prev = head;
        for (int i = 0; i < index - 1; i++) {
            prev = prev.next;
        }
        // prev引用指向当前插入index的前驱
        node.next = prev.next;
        prev.next = node;
        size ++;
    }



    public void addLast(int data) {
        addIndex(size,data);
    }


    @Override
    public String toString() {
        String ret = "";
        // 为啥此时要有一个临时变量node来存储head的值?
        ListNode node = head;
        while (node != null) {
            ret += node.val + "->";
            // 继续访问下一节车厢
            node = node.next;
        }
        return ret;
    }




}
